﻿using System;
using WpfApp1.Acme.ApplicationClass;

namespace WpfApp1.Acme.ApplicationAttribute {
    /// <summary>
    /// Component特性是为了标记指定的类为框架的Bean
    /// 从而初始化Bean的信息来进行实例化
    /// </summary>
    [AttributeUsage(AttributeTargets.Class,
        AllowMultiple = false , Inherited = true)]
    internal class Component: Attribute {
        public Component(string beanName = "") { 
            BeanName = beanName;
        }
        public string BeanName { get; set; }
    }

    /// <summary>
    /// 标记Component标记的类初始化的bean的类型
    /// 可以是ScopeType.singleton单例的，或者
    /// ScopeType.prototype原型的，单例的bean
    /// 在实例化的时候只在单例池中存储这一个bean
    /// 顾每次getBean的时候它的HashCode的值是一
    /// 致的，而且原型实例化的bean在每次getBean
    /// 都会在单例池里创建一个bean，所以它的HashCode
    /// 每次都不一致
    /// </summary>
    [AttributeUsage(AttributeTargets.Class,
        AllowMultiple = false)]
    public class Scope : Attribute {
        public Scope(ScopeType scopeValue = ScopeType.singleton) {
            ScopeValue = scopeValue;
        }

        public ScopeType ScopeValue { get; set; }
    }

    /// <summary>
    /// 标记Component标记的类初始化的bean的类型是否是懒加载的，
    /// 而懒加载相对于单例使用了懒汉模式，默认为饿汉模式
    /// </summary>
    [AttributeUsage(AttributeTargets.Class,
        AllowMultiple = false)]
    public class Lazy : Attribute {
    }
}
